#ifndef _DB_API_H_
#define _DB_API_H_

#ifdef __cplusplus
extern "C"{
#endif

#ifdef _WIN32
#include <stdio.h>
#include "assert.h"
#include "oal.h"
#define SDROOT	"E:"
#else
#include "sys_inc.h"
#include "yp3_common.h"
#include "hal.h"
#define assert(...)
#define SDROOT	"0:"
#endif

#define WAVEROOT		SDROOT"\\record"

#define	MEDIA_LO_TXT		(0x01<<0)		//	".txt",
#define	MEDIA_LO_BMP		(0x01<<1)		//	".bmp",
#define	MEDIA_LO_JPG		(0x01<<2)		//	".jpg",
#define	MEDIA_LO_JPEG		(0x01<<3)		//	".jpeg",
#define	MEDIA_LO_MP3		(0x01<<4)		//	".mp3",
#define	MEDIA_LO_AAC		(0x01<<5)		//	".aac",
#define	MEDIA_LO_WMA		(0x01<<6)		//	".wma",
#define	MEDIA_LO_M4A		(0x01<<7)		//	".m4a",
#define	MEDIA_LO_FLAC		(0x01<<8)		//	".flac",
#define	MEDIA_LO_APE		(0x01<<9)		//	".ape",
#define	MEDIA_LO_WAV		(0x01<<10)		//	".wav",
#define	MEDIA_LO_OGG		(0x01<<11)		//	".ogg",
#define	MEDIA_LO_AVI		(0x01<<12)		//	".avi",
#define MEDIA_HI_TEXT		(0x01<<16)		//	TEXT
#define MEDIA_HI_IMAGE		(0x02<<16)		//	IMAGE
#define MEDIA_HI_AUDIO		(0x04<<16)		//	AUDIO
#define MEDIA_HI_VIDEO		(0x08<<16)		//	VIDEO
#define MEDIA_HI_FOLDER		(0x10<<16)		//	FOLDER
#define MEDIA_HI_WAVE		(0x20<<16)		//	WAVE file in record folder
#define MEDIA_ALL			0xFFFFFFFF

#define	MAXPATH		260
#define MAXUTF8ITEM	64
#define MAXTAG		6

typedef void (*db_cb)(int state, int code);
//state == -555；db需要扫描，code=驱动进度条
//state == -666；db无需扫描
//state == -2、-1、0、1、2、3、4；状态机，其中state==-2为db出错，UI需要处理，其他情况不理会
//state == others；调试专用，和业务无关

typedef int (*get_sd_status)(int sd_id);
typedef char RECITEMUTF8[MAXUTF8ITEM];

typedef struct tagRecord
{
	char path[MAXPATH];			//数据库主键，不能修改，不能转码
	char fname[MAXUTF8ITEM];	//utf8格式的文件名，只用于UI显示
	char album[MAXUTF8ITEM];	//utf8格式
	char artist[MAXUTF8ITEM];	//utf8格式
	unsigned int type;			//媒体类别，按位操作
	unsigned int like;			//按位记录喜欢列表
	unsigned int tag[MAXTAG];	//音乐、电子书的标签
	unsigned int sorthash;		//排序hash值
	unsigned int flag;			//0=正常；1=删除；-1=错误文件；
}RECORD;

int db_init(db_cb cb, get_sd_status cb_get_sd_status);//返回0=成功；-99=卡满；others=文件系统错误
void db_free(void);
int db_reset(void);			//返回0=成功；-99=卡满；others=文件系统错误
int db_get_state(void);		//获取数据库状态；-1=数据库未初始化；0=unmount；1=构建中；2=就绪，应用可以访问。-2=数据库出错

int db_mount(void);
int db_unmount(void);

int db_set_like(char * path, int like);//like值必须在±32之间，不能为0！正值表示设置为喜欢；负值表示设置成不喜欢
int db_delete_file(char * path);// 返回-1表示出错；0=OK
int db_add_wave(char * path);// 返回-1表示出错；0=OK
int db_add_tag(
	char * path,			// 文件名；类型是 MEDIA_HI_TEXT / MEDIA_HI_AUDIO / MEDIA_HI_WAVE
	unsigned int No,		// 标签序号
	unsigned int tag		// 标签值
	);						// 返回-1表示出错；0=OK

int db_read_type(
	unsigned int type,		// MEDIA_HI_TEXT / MEDIA_HI_IMAGE / MEDIA_HI_AUDIO / MEDIA_HI_VIDEO / MEDIA_HI_WAVE
	unsigned int offset,	// 偏移值
	RECORD * records,		// 输出的记录指针，0=不输出记录信息
	RECITEMUTF8 * fname,	// 输出的utf8文件名指针，0=不输出文件名
	unsigned int cnt		// 请求的记录个数
	);						// 返回读取到的记录个数，-1表示出错；参数全0（type除外）返回该type的总个数

int db_read_like(
	int like,				// 喜欢号，1-32之间
	unsigned int offset,	// 偏移值
	RECORD * records,		// 输出的记录指针，0=不输出记录信息
	RECITEMUTF8 * fname,	// 输出的utf8文件名指针，0=不输出文件名
	unsigned int cnt		// 请求的记录个数
	);						// 返回读取到的记录个数，-1表示出错；参数全0（like除外）返回该like的总个数

int db_read_folder(
	char * dir,				// 目录名
	unsigned int offset,	// 偏移值
	RECORD * records,		// 输出的记录指针，0=不输出记录信息
	RECITEMUTF8 * fname,	// 输出的utf8文件名指针，0=不输出文件名
	unsigned int cnt		// 请求的记录个数
	);						// 返回读取到的记录个数，-1表示出错；参数全0（dir除外）返回该dir的总个数；如果dir也填0，则返回所有目录的个数

int db_read_pl(
	char * dir,				// 目录名
	unsigned int offset,	// 偏移值
	RECORD * records,		// 输出的记录指针，0=不输出记录信息
	RECITEMUTF8 * fname,	// 输出的utf8文件名指针，0=不输出文件名
	unsigned int cnt		// 请求的记录个数
	);						// 返回读取到的记录个数，-1表示出错；参数全0（dir除外）返回该dir的总个数；如果dir也填0，则返回所有目录的个数

int db_read_album(
	char * album,			// 专辑名，utf8格式
	unsigned int offset,	// 偏移值
	RECORD * records,		// 输出的记录指针，0=不输出记录信息
	RECITEMUTF8 * fname,	// 输出的utf8文件名指针，0=不输出文件名
	RECITEMUTF8 * albums,	// 输出的utf8专辑名指针，0=不输出专辑名
	unsigned int cnt		// 请求的记录个数
	);						// 返回读取到的记录个数，-1表示出错；参数全0（album除外）返回该album的歌曲的总个数；如果album也填0，则返回所有album的个数
							// 特别说明：album为空，查询所有专辑名称信息，此时不理会records和fname指针。当指针albums非空，取回专辑名称列表
							// 特别说明：album非空，查询指定专辑的音乐文件信息，此时不理会albums指针。当指针records和fname其中一个不为空，取回该专辑音乐相应的字段信息

int db_read_artist(
	char * artist,			// 艺术家名，utf8格式
	unsigned int offset,	// 偏移值
	RECORD * records,		// 输出的记录指针，0=不输出记录信息
	RECITEMUTF8 * fname,	// 输出的utf8文件名指针，0=不输出文件名
	RECITEMUTF8 * artists,	// 输出的utf8专辑名指针，0=不输出专辑名
	unsigned int cnt		// 请求的记录个数
	);						// 返回读取到的记录个数，-1表示出错；参数全0（artist除外）返回该artist的歌曲的总个数；如果artist也填0，则返回所有artist的个数
							// 特别说明：artist为空，查询所有歌手名称信息，此时不理会records和fname指针。当指针albums非空，取回歌手名称列表
							// 特别说明：artist非空，查询指定歌手的音乐文件信息，此时不理会artists指针。当指针records和fname其中一个不为空，取回该专辑音乐相应的字段信息

#ifdef __cplusplus
}
#endif

#endif
